package com.grq.mis.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Repository
public class RedisDao {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private HashOperations<String, String, String> hashOperations;

    public RedisDao() {
    }

    @PostConstruct
    private void init() {
        hashOperations = stringRedisTemplate.opsForHash();
    }

    ////////////////////////////////////////  通用  ///////////////////////////////////////////////////////////////

    /**
     * 删除表
     *
     * @param table
     */
    public void deleteTable(String table) {
        stringRedisTemplate.delete(table);
    }

    /**
     * 设置表生效时间 单位：秒
     *
     * @param table
     * @param seconds
     */
    public void expire(String table, int seconds) {
        stringRedisTemplate.expire(table, seconds, TimeUnit.SECONDS);
    }


    ////////////////////////////////////////  string  ///////////////////////////////////////////////////////////////

    /**
     * 查询
     *
     * @param key
     * @return
     */
    public String stringGet(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 永久保存
     *
     * @param key
     * @param value
     */
    public void stringSave(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }

    /**
     * 保存固定时间 单位：秒
     *
     * @param key
     * @param value
     * @param time
     */
    public void stringSave(String key, String value, long time) {
        if (time <= 0) {
            stringSave(key, value);
        } else {
            stringRedisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
        }
    }

    /**
     * 保存固定时间 单位：自定义
     *
     * @param key
     * @param value
     * @param time
     * @param timeUnit
     */
    public void stringSave(String key, String value, long time, TimeUnit timeUnit) {
        if (time <= 0) {
            stringSave(key, value);
        } else {
            stringRedisTemplate.opsForValue().set(key, value, time, timeUnit == null ? TimeUnit.SECONDS : timeUnit);
        }
    }

    /**
     * 自增
     *
     * @return
     */
    public long increment(String key) {
        return stringRedisTemplate.opsForValue().increment(key);
    }

    /**
     * 查看有无，没有设置为value
     * @param key
     * @param value
     * @return
     */
    public boolean setIfAbsent(String key, String value) {
        return stringRedisTemplate.opsForValue().setIfAbsent(key, value);
    }

    ////////////////////////////////////////  hash  ///////////////////////////////////////////////////////////////

    /**
     * 保存
     *
     * @param table
     * @param key
     * @param value
     */
    public void hashSave(String table, String key, String value) {
        stringRedisTemplate.opsForHash().put(table, key, value);
    }

    /**
     * 查询单个
     *
     * @param table
     * @param key
     * @return
     */
    public String hashGet(String table, String key) {
        return (String) stringRedisTemplate.opsForHash().get(table, key);
    }

    /**
     * 查询所有
     *
     * @param table
     * @return
     */
    public List<String> hashAll(String table) {
        return hashOperations.values(table);
    }

    /**
     * 查询指定数组
     *
     * @param table
     * @param keys
     * @return
     */
    public List<String> hashGets(String table, Collection<String> keys) {
        return hashOperations.multiGet(table, keys);
    }

    /**
     * 删除
     *
     * @param table
     * @param keys
     */
    public void hashDelete(String table, String... keys) {
        hashOperations.delete(table, keys);
    }

    ////////////////////////////////////////  list  ///////////////////////////////////////////////////////////////

    ////////////////////////////////////////  set  ///////////////////////////////////////////////////////////////

    ////////////////////////////////////////  zset  ///////////////////////////////////////////////////////////////


}
